// Clase MON(itor)_LECT(ores)_ESCR(itores) con Politica SX
// Metodos: empezar_leer, acabar_leer, empezar_escribir, acabar_escribir
// Bibliografia: Concurrent Programming. The Java Programming Language
// Pags 139-140. S. J. Hartley. Oxford University Press.
// Fecha: Noviembre 2003

class mon_lect_escr_sx extends monitor_sx {
  private int num_lect, num_escr; // numero de lectores y escritores en base de datos, respectivamente
  private int num_lect_esp, num_escr_esp; // numero de lectores y escritores esperando, respectivamente
  private cond_sx OKLeer, OKEscribir; // detener a los procesos lectores y escritores, respectivamente
  // private static final long Tiempo = System.currentTimeMillis();

  // constructor
  public mon_lect_escr_sx() {
    super();
    num_lect = num_escr = num_lect_esp = num_escr_esp = 0;
    OKLeer = new cond_sx(this);
    OKEscribir = new cond_sx(this);
  } // mon_lect_escr_sx

  public void empezar_leer() {
    lock();
    if (num_escr > 0 || num_escr_esp > 0) {
      num_lect_esp++;
      Wait(OKLeer);
      num_lect_esp--;
    } // if ...
    num_lect++;
    Signal(OKLeer);
    unlock();
  } // empezar_leer

  public void acabar_leer() {
    lock();
    num_lect--;
    if (num_lect == 0 && num_escr_esp > 0)
      Signal(OKEscribir);
    unlock();
  } // acabar_leer

  public void empezar_escribir() {
    lock();
    if (num_lect > 0 || num_escr > 0) {
      num_escr_esp++;
      Wait(OKEscribir);
      num_escr_esp--;
    } // if ...
    num_escr++;
    unlock();
  } // empezar_escribir

  public void acabar_escribir() {
    lock();
    num_escr--;
    if (num_lect_esp > 0)
      Signal(OKLeer);
    else // if (num_escr_esp > 0)
      Signal(OKEscribir);
    unlock();
  } // acabar_escribir
} // mon_lect_escr_sx
